import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'
import getPageTitle from '@/utils/get-page-title'

NProgress.configure({ showSpinner: false })

// 白名单路由
const whiteList = ['/login', '/auth-redirect']

router.beforeEach(async (to, from, next) => {
    // 开始进度条
    NProgress.start()

    // 设置页面标题
    document.title = getPageTitle(to.meta.title)

    // 获取token判断是否已登录
    const hasToken = getToken()
    console.log('路由守卫 - Token状态:', hasToken ? '已登录' : '未登录', '目标路径:', to.path)

    if (hasToken) {
        if (to.path === '/login') {
            // 如果已登录，重定向到首页
            console.log('已登录状态访问登录页，重定向到首页')
            next({ path: '/' })
            NProgress.done()
        } else {
            try {
                // 确定用户是否已获取其权限角色
                const hasRoles = store.getters.roles && store.getters.roles.length > 0
                console.log('检查角色:', hasRoles ? '已获取角色' : '未获取角色')

                if (hasRoles) {
                    next()
                } else {
                    try {
                        console.log('开始获取用户信息...')
                        // 获取用户信息
                        // 注意: 角色必须是对象数组! 例如: ['admin'] 或 ['developer', 'editor']
                        const { roles, permissions } = await store.dispatch('user/getInfo')
                        console.log('获取用户信息成功:', { roles, permissions })

                        // 根据角色生成可访问路由
                        console.log('开始生成动态路由...')
                        const accessRoutes = await store.dispatch('permission/generateRoutes', { roles, permissions })
                        console.log('生成动态路由成功:', accessRoutes)

                        // 动态添加可访问路由
                        router.addRoutes(accessRoutes)
                        console.log('动态路由添加完成')

                        // 强制刷新标签视图
                        store.dispatch('tagsView/delAllViews').then(() => {
                            console.log('已清空标签视图，准备重新初始化')

                            // 添加首页标签
                            const homeRoute = router.options.routes.find(r => r.path === '/')
                            if (homeRoute && homeRoute.children && homeRoute.children.length > 0) {
                                const dashboard = homeRoute.children[0]
                                store.dispatch('tagsView/addVisitedView', {
                                    path: '/dashboard',
                                    name: dashboard.name,
                                    meta: dashboard.meta,
                                    title: dashboard.meta.title
                                })
                                console.log('已添加首页标签')
                            }
                        })

                        // 设置replace: true，这样导航就不会留下历史记录
                        next({ ...to, replace: true })
                    } catch (error) {
                        console.error('获取用户信息或生成路由失败:', error)
                        // 移除token并跳转到登录页重新登录
                        await store.dispatch('user/resetToken')

                        let errorMsg = '认证失败，请重新登录'
                        if (error) {
                            if (typeof error === 'string') {
                                errorMsg = error
                            } else if (error.message) {
                                errorMsg = error.message
                            }
                        }

                        Message.error(errorMsg)
                        next(`/login?redirect=${to.path}`)
                        NProgress.done()
                    }
                }
            } catch (e) {
                console.error('路由守卫异常:', e)
                next(`/login?redirect=${to.path}`)
                NProgress.done()
            }
        }
    } else {
        /* 没有token */
        if (whiteList.indexOf(to.path) !== -1) {
            // 如果在免登录白名单中，直接进入
            console.log('访问白名单页面:', to.path)
            next()
        } else {
            // 其他无权访问的页面将重定向到登录页面
            console.log('未登录访问受保护页面，重定向到登录页')
            next(`/login?redirect=${to.path}`)
            NProgress.done()
        }
    }
})

router.afterEach(() => {
    // 完成进度条
    NProgress.done()
}) 